#include "playscene2.h"
#include<QIcon>
#include<QPainter>
#include<QMouseEvent>
#include<QDebug>
#include<ctime>
#include<QMenuBar>
#include<QSoundEffect>
#include<QLabel>


playscene2::playscene2(QWidget *parent)
    : QMainWindow{parent}
{

    //播放音频
    QSoundEffect * Sound = new QSoundEffect(this);
    Sound->setSource(QUrl::fromLocalFile(":/res/tom.wav"));
    Sound->setVolume(0.1f);
    Sound->setLoopCount(10);
    Sound->play();
    QTimer::singleShot(1000,this,[=](){
        Sound->setVolume(0.2f);
    });


    //切换音效
    QSoundEffect * clickSound = new QSoundEffect(this);
    clickSound->setSource(QUrl::fromLocalFile(":/res/TapButtonSound.wav"));
    clickSound->setVolume(0.1f);//调节音量


    initscene();

    QMenuBar*bar=menuBar();
    setMenuBar(bar);

    QMenu*start=bar->addMenu("开始");
    start->setIcon(QIcon(":/res/flag.png"));
    //返回按钮
    QAction* back=start->addAction("返回");
    back->setIcon(QIcon(":/res/return.png"));
    connect(back,&QAction::triggered,[=](){
        clickSound->play();

        emit this->chooseBack();
    });
    //暂停按钮
    QAction*pause=start->addAction("暂停");
    pause->setIcon(QIcon(":/res/pause.png"));


    connect(pause,&QAction::triggered,[=](){
        clickSound->play();
        if(herolife>0){//bug修复，人物得活着你才能暂停
            if(isRun){
                m_timer.stop();
                isRun=false;
            }
            else {
                m_timer.start();
                isRun=true;
            }
        }
    });



    heli.h_x=150;
    heli.h_y=535;

    m_timer.start();
    //监听信号
    connect(&m_timer,&QTimer::timeout,[=](){
        enemyCome();
        //更新坐标
        updatePostion();
        //重新绘制
        update();

        //碰撞检测
        collisionDetec();
    });


    //显示游戏结束
    QLabel *label=new QLabel;
    label->setParent(this);

    //设置字体
    QFont font;
    font.setFamily("华文新魏");
    font.setPointSize(30);
    //设置颜色
    QPalette pe;
    pe.setColor(QPalette::WindowText,Qt::white);
    label->setPalette(pe);

    //将字体设置到标签控件
    label->setFont(font);
    label->setText("GAME OVER");

    label->setGeometry(65,263,300,80);
    label->move(-230,263);

    //游戏结束
    connect(this,&playscene2::gameover,[=](){
        label->move(65,263);
//        qDebug()<<label->x();

        //碰撞过快的话会出bug，不显示直接就暂停了,要不改成清屏？
//        m_timer.stop();

        //游戏结束清屏
        for(int i=0;i<20;i++){
            enemys[i].is_free2=true;
        }
        Sound->setVolume(0.1f);//声音调小
        //画面暂停
        QTimer::singleShot(5000,this,[=](){
            m_timer.stop();
            Sound->stop();
        });


    });


}

void playscene2::initscene()
{
    setFixedSize(350,615);
    setWindowTitle("MajorTom");
    setWindowIcon(QIcon(":/res/pilot.png"));

    m_timer.setInterval(10);//刷新率

    //敌机出场时间间隔初始化
    e_recoder=0;

    //随机数种子
    srand((unsigned int)time(NULL));
}

void playscene2::updatePostion()
{
    map->map_for2();

    //发射子弹
    heli.shoot();

    //计算非空闲子弹坐标
    for(int i=0;i<30;i++){
        if(heli.bullets[i].is_free1==false){
            heli.bullets[i].UpdatePosition();
        }
    }

    //敌机的位置
    for(int i=0;i<20;i++){
        if(enemys[i].is_free2==false){
            enemys[i].updatePosition();
        }
    }

    //计算爆炸播放图片
    for(int i=0;i<20;i++){
        if(bombs[i].is_free==false){
            bombs[i].updateInfo();
        }
    }

}

void playscene2::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawPixmap(0,map->m1_x+15,map->map1);
    painter.drawPixmap(0,map->m2_x+15,map->map2);

    painter.drawPixmap(heli.h_x,heli.h_y,heli.tom);

    //绘制子弹
    for(int i=0;i<30;i++){
        if(heli.bullets[i].is_free1==false){
           painter.drawPixmap(heli.bullets[i].b_x,heli.bullets[i].b_y,heli.bullets[i].m_bullet);
        }
    }

    //绘制敌机
    for(int i=0;i<20;i++){
        if(enemys[i].is_free2==false){
            painter.drawPixmap(enemys[i].e_x,enemys[i].e_y,enemys[i].pix);
        }
    }

    //绘制爆炸
    for(int i=0;i<20;i++){
        if(bombs[i].is_free==false){
            painter.drawPixmap(bombs[i].x,bombs[i].y,
                               bombs[i].pixArr[bombs[i].picIndex]);
            //下标是一直在计算的
        }
    }

}

//鼠标操控
//碰撞检测有些问题，而且好像会让它瞬移
void playscene2::mouseMoveEvent(QMouseEvent *ev)
{    

    int x=ev->x()-heli.h_rect.width()*0.5-10;
    int y=ev->y()-heli.h_rect.height()*0.5-10;

    //边界检测
    if(x<=0){
        x=0;
    }
    if(x>=280){
        x=280;
    }
    if(y<=0){
        y=0;
    }
    if(y>=530+15){
        y=530+15;
    }
    heli.setPosition(x,y);
}

//键盘操控
void playscene2::keyPressEvent(QKeyEvent *e)
{
    if(!e->isAutoRepeat()){//屏蔽长按而产生的指令

        switch(e->key()){
        case Qt::Key_Up:heli.setPosition(heli.h_x,heli.h_y-20);
            //边界检测
            if(heli.h_y<=0){
                heli.h_y=0;
            }
            heli.setPosition(heli.h_x,heli.h_y);
            break;
        case Qt::Key_Down:heli.setPosition(heli.h_x,heli.h_y+20);
            //边界检测
            if(heli.h_y>=530+15){
                heli.h_y=530+15;
            }
            heli.setPosition(heli.h_x,heli.h_y);
            break;
        case Qt::Key_Left:heli.setPosition(heli.h_x-25,heli.h_y);
            //边界检测
            if(heli.h_x<=0){
                heli.h_x=0;
            }
            heli.setPosition(heli.h_x,heli.h_y);
            break;
        case Qt::Key_Right:heli.setPosition(heli.h_x+25,heli.h_y);
            //边界检测
            if(heli.h_x>=285){
                heli.h_x=280;
            }
            heli.setPosition(heli.h_x,heli.h_y);
            break;
        }
    }

}


//敌机出场函数
void playscene2::enemyCome()
{
    e_recoder++;
    if(e_recoder<30){
        return;
    }
    e_recoder=0;

    if(herolife>0){
        //遍历
        while(1){
            int i=rand()%(40)%20;
            //如果空闲则出场
            if(enemys[i].is_free2){
                enemys[i].is_free2=false;

                //坐标
                enemys[i].e_x=rand()%(350-enemys[i].e_rect.width()-20);//随机
                enemys[i].e_y=-enemys[i].e_rect.height()-100;//稍微设置高一点
                break;
            }
        }
    }

}

//碰撞
void playscene2::collisionDetec()
{
    //遍历非空闲敌机
    for(int i=0;i<20;i++){
        //如果空闲则看下一个
        if(enemys[i].is_free2){
            continue;
        }
        //再遍历非空闲子弹
        for(int j=0;j<30;j++){
            if(heli.bullets[j].is_free1){
                continue;
            }
            //检测飞机子弹是否相交
            if(enemys[i].e_rect.intersects(heli.bullets[j].b_rect)){
                //设为非空闲
                enemys[i].is_free2=true;
                heli.bullets->is_free1=true;

                //播放爆炸效果
                for(int k=0;k<20;k++){
                    if(bombs[k].is_free){
                        //空闲即播放
                        bombs[k].is_free=false;
                        bombs[k].x=enemys[i].e_x;
                        bombs[k].y=enemys[i].e_y;

                        break;
                    }
                }
            }
        }

        //检查飞机碰撞
        if(enemys[i].e_x>heli.h_x&&enemys[i].e_x<heli.h_x+heli.h_rect.width()&&enemys[i].e_y+enemys[i].e_rect.height()>heli.h_y){

            herolife--;
            //播放爆炸效果
            for(int k=0;k<20;k++){
                if(bombs[k].is_free){
                    //空闲即播放
                    bombs[k].is_free=false;
                    bombs[k].x=heli.h_x;
                    bombs[k].y=heli.h_y;

                    break;
                }
            }
            if(herolife<=0){//之前忽略掉了被，可算修好了
                emit this->gameover();
                return;}
            //为了让动画显示全
            enemys[i].is_free2=true;

        }
        if(enemys[i].e_x<heli.h_x&&enemys[i].e_y+enemys[i].e_rect.height()>heli.h_y&&enemys[i].e_x+enemys[i].e_rect.width()>heli.h_x){

            herolife--;
            //播放爆炸效果
            for(int k=0;k<20;k++){
                if(bombs[k].is_free){
                    //空闲即播放
                    bombs[k].is_free=false;
                    bombs[k].x=heli.h_x;
                    bombs[k].y=heli.h_y;

                    break;
                }
            }
            if(herolife<=0){
//                m_timer.stop();
                emit this->gameover();
                return;
            }
            //为了让游戏结束动画更明显
            enemys[i].is_free2=true;
        }
    }
}

